package edu.vt.ece.rt.benchmark.labyrinth;

public class Coordinate {

    long x;
    long y;
    long z;
    long value;
    
    
    Coordinate (long x, long y, long z) {
    	this.x = x;
    	this.y = y;
    	this.z = z;
    }
    /* =============================================================================
     * coordinate_isEqual
     * =============================================================================
     */
    static boolean
    coordinate_isEqual (Coordinate aPtr, Coordinate bPtr)
    {
        if ((aPtr.x == bPtr.x) &&
            (aPtr.y == bPtr.y) &&
            (aPtr.z == bPtr.z))
        {
            return true;
        }

        return false;
    }

    /* =============================================================================
     * getPairDistance
     * =============================================================================
     */
    static double
    getPairDistance (Pair pairPtr)
    {
        Coordinate aPtr = (Coordinate)pairPtr.firstPtr;
        Coordinate bPtr = (Coordinate)pairPtr.secondPtr;
        long dx = aPtr.x - bPtr.x;
        long dy = aPtr.y - bPtr.y;
        long dz = aPtr.z - bPtr.z;
        long dx2 = dx * dx;
        long dy2 = dy * dy;
        long dz2 = dz * dz;
        return Math.sqrt((double)(dx2 + dy2 + dz2));
    }


    /* =============================================================================
     * coordinate_comparePair
     * -- For sorting in list of source/destination pairs
     * -- Route longer paths first so they are more likely to succeed
     * =============================================================================
     */
    long
    coordinate_comparePair (Pair aPtr, Pair bPtr)
    {
        double aDistance = getPairDistance((Pair)aPtr);
        double bDistance = getPairDistance((Pair)bPtr);

        if (aDistance < bDistance) {
            return 1;
        } else if (aDistance > bDistance) {
            return -1;
        }

        return 0;
    }


    /* =============================================================================
     * coordinate_areAdjacent
     * =============================================================================
     */
    static boolean coordinate_areAdjacent (Coordinate aPtr, Coordinate bPtr)
    {
        long dx = aPtr.x - bPtr.x;
        long dy = aPtr.y - bPtr.y;
        long dz = aPtr.z - bPtr.z;
        long dx2 = dx * dx;
        long dy2 = dy * dy;
        long dz2 = dz * dz;

        if ((dx2 + dy2 + dz2) == 1) 
        	return	true; 
        	else
        	return	false;
    }

    
}
